#ifndef _LOGGER_HPP
#define _LOGGER_HPP

#include <string>
#include <fstream>
#include <mutex>
#include <memory>

/**
 * 日志级别枚举
 */
enum class LogLevel {
    INFO,
    WARN,
    ERROR
};

/**
 * 日志类型枚举
 */
enum class LogType {
    SERVER,    // 服务端日志(登录、注册、运行错误等)
    DATABASE   // 数据库操作日志
};

/**
 * 日志系统类 - 单例模式
 * 提供服务端日志和数据库日志的分离记录功能
 * 自动按天创建日志文件,文件名包含日期
 */
class MyLogger {
public:
    // 获取单例实例
    static MyLogger& getInstance();

    // 禁用拷贝构造和赋值操作
    MyLogger(const MyLogger&) = delete;
    MyLogger& operator=(const MyLogger&) = delete;

    // 设置日志文件保存路径
    void setLogDirectory(const std::string& dir);

    // 服务端日志接口
    void serverInfo(const std::string& message);
    void serverWarn(const std::string& message);
    void serverError(const std::string& message);

    // 数据库日志接口
    void dbInfo(const std::string& message);
    void dbWarn(const std::string& message);
    void dbError(const std::string& message);

    // 通用日志接口(供内部或高级用户使用)
    void log(LogType type, LogLevel level, const std::string& message);

private:
    MyLogger();
    ~MyLogger();

    // 获取当前日期字符串(YYYY-MM-DD格式)
    std::string getCurrentDate();
    
    // 获取当前时间字符串(YYYY-MM-DD HH:MM格式)
    std::string getCurrentDateTime();
    
    // 获取日志级别字符串
    std::string getLevelString(LogLevel level);
    
    // 检查并更新日志文件(如果日期变化则创建新文件)
    void checkAndRotateLogFile(LogType type);
    
    // 获取日志文件路径
    std::string getLogFilePath(LogType type, const std::string& date);
    
    // 写入日志到文件
    void writeLog(LogType type, LogLevel level, const std::string& message);

private:
    std::string logDirectory_;           // 日志文件保存目录
    std::string currentDate_;            // 当前日期
    
    std::ofstream serverLogFile_;        // 服务端日志文件流
    std::ofstream dbLogFile_;            // 数据库日志文件流
    
    std::mutex serverMutex_;             // 服务端日志互斥锁
    std::mutex dbMutex_;                 // 数据库日志互斥锁
};

#endif // LOGGER_H
